/**
 * 
 */
package gestionBulletins.model.persistance.sqliteImpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import gestionBulletins.model.Enfant;
import gestionBulletins.model.Adherent;

import java.util.ArrayList;
import java.util.Collection;
import gestionBulletins.model.persistance.DaoEnfant;

/**
 * Implémentation du DAO Enfant pour le type de persistance SQLite
 * @author Paraita Wohler
 *
 */
public class DaoEnfantSqliteImpl implements DaoEnfant {

	private Connection conn;
	private static String insert = "insert into enfant (nom, prenom, date_naissance, sexe, pere, mere) " +
			"values (?,?,?,?,?,?);";
	private static String reqIdByNomPrenom = "select id from enfant where nom=? and prenom=?;";
	private static String reqById = "select * from enfant where id=?;";
	public static String update = "update enfant set nom=?, prenom=?, date_naissance=?, " +
			"sexe=?, pere=?, mere=? where id=?;";
	public static String delete = "delete from enfant where id=?;";
	public static String reqByParent = "select * from enfant where pere=? or mere=?;";

	public DaoEnfantSqliteImpl(Connection conn) {
		this.conn = conn;
	}

	/* (non-Javadoc)
	 * @see gestionBulletins.model.persistance.DaoEnfant#create(gestionBulletins.model.Enfant)
	 */
	@SuppressWarnings("finally")
	@Override
	public Enfant create(Enfant enfant) {
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(reqIdByNomPrenom);
			ps.setString(1, enfant.getNom());
			ps.setString(2, enfant.getPrenom());
			rs = ps.executeQuery();
			/* si un enfant avec ce nom et prenom existe deja on retourne null */
			if (rs.next()) {
				enfant = null;
				rs.close();
			}
			else {
				ps.close();
				String date = enfant.getDateNaissanceJour() + "-" + enfant.getDateNaissanceMois() + "-" + enfant.getDateNaissanceAnnee();
				ps = conn.prepareStatement(insert);
				ps.setString(1, enfant.getNom());
				ps.setString(2, enfant.getPrenom());
				ps.setString(3, date);
				ps.setString(4, enfant.getSexe());
				ps.setInt(5, enfant.getPere());
				ps.setInt(6, enfant.getMere());
				ps.execute();
				ps.close();
				ps = conn.prepareStatement(reqIdByNomPrenom);
				ps.setString(1, enfant.getNom());
				ps.setString(2, enfant.getPrenom());
				rs = ps.executeQuery();
				enfant.setId(rs.getInt("id"));
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return enfant;
		}
	}

	/* (non-Javadoc)
	 * @see gestionBulletins.model.persistance.DaoEnfant#requestById(int)
	 */
	@SuppressWarnings("finally")
	@Override
	public Enfant requestById(int id) {
		Enfant enfant = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(reqById);
			ps.setInt(1, id);
			rs = ps.executeQuery();
			/* si un enfant avec cet id existe
			 * sinon ca renvoie null
			 * */
			if (rs.next()) {
				String date = rs.getString("date_naissance");
				enfant = new Enfant (rs.getString("nom"), rs.getString("prenom"));
				enfant.setDateNaissanceJour(date.split("-")[0]);
				enfant.setDateNaissanceMois(date.split("-")[1]);
				enfant.setDateNaissanceAnnee(date.split("-")[2]);
				enfant.setSexe(rs.getString("sexe"));
				enfant.setPere(rs.getInt("pere"));
				enfant.setMere(rs.getInt("mere"));
				enfant.setId(rs.getInt("id"));
			}

		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (ps != null) {
				try {
					ps.close();
				}
				catch(SQLException e) {
					e.printStackTrace();
				}
			}
			if (rs != null) {
				try {
					rs.close();
				}
				catch(SQLException e) {
					e.printStackTrace();
				}
			}
			return enfant;
		}
	}

	@SuppressWarnings("finally")
	public Collection<Enfant> requestAllByParentId(Adherent adherent) {

		ArrayList<Enfant> enfants = new ArrayList<Enfant>();
		PreparedStatement ps = null;
		ResultSet rs = null;
		Enfant enfant = null;
		try {
			ps = conn.prepareStatement(reqByParent);
			ps.setInt(1, adherent.getId());
			ps.setInt(2, adherent.getId());
			rs = ps.executeQuery();
			while (rs.next()) {
				String date = rs.getString("date_naissance");
				enfant = new Enfant (rs.getString("nom"), rs.getString("prenom"));
				enfant.setDateNaissanceJour(date.split("-")[0]);
				enfant.setDateNaissanceMois(date.split("-")[1]);
				enfant.setDateNaissanceAnnee(date.split("-")[2]);
				enfant.setSexe(rs.getString("sexe"));
				enfant.setPere(rs.getInt("pere"));
				enfant.setMere(rs.getInt("mere"));
				enfant.setId(rs.getInt("id"));
				enfants.add(enfant);
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (ps != null) {
				try {
					ps.close();
				}
				catch(SQLException e) {
					e.printStackTrace();
				}
			}
			if (rs != null) {
				try {
					rs.close();
				}
				catch(SQLException e) {
					e.printStackTrace();
				}
			}
			return enfants;
		}

	}


	/* (non-Javadoc)
	 * @see gestionBulletins.model.persistance.DaoEnfant#update(gestionBulletins.model.Enfant)
	 */
	@Override
	public void update(Enfant enfant) {
		PreparedStatement ps = null;
		try {
			ps = conn.prepareStatement(update);
			ps.setString(1, enfant.getNom());
			ps.setString(2, enfant.getPrenom());
			ps.setString(3, enfant.getDateNaissanceJour() + "-" + 
					enfant.getDateNaissanceMois() + "-" +
					enfant.getDateNaissanceAnnee());
			ps.setString(4, enfant.getSexe());
			ps.setInt(5, enfant.getPere());
			ps.setInt(6, enfant.getMere());
			ps.setInt(7, enfant.getId());
			ps.executeUpdate();
			ps.close();
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/* (non-Javadoc)
	 * @see gestionBulletins.model.persistance.DaoEnfant#delete(gestionBulletins.model.Enfant)
	 */
	@Override
	public void delete(Enfant enfant) {
		PreparedStatement ps = null;
		try {
			ps = conn.prepareStatement(delete);
			ps.setInt(1, enfant.getId());
			ps.execute();
			ps.close();
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

	@SuppressWarnings("finally")
	@Override
	public int requestIdByNomPrenom(String nom, String prenom) {
		int resultat = -1;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = conn.prepareStatement(reqIdByNomPrenom);
			ps.setString(1, nom);
			ps.setString(2, prenom);
			rs = ps.executeQuery();
			if (rs.next()) {
				resultat = rs.getInt("id");
			}
			rs.close();
			ps.close();
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (ps != null) {
				try {
					ps.close();
				}
				catch(SQLException e) {
					e.printStackTrace();
				}
			}
			return resultat;
		}
	}

}
